package Controlador;

import Modelo.Desencriptador;
import Modelo.Encriptador;
import Modelo.ICliente;
import Modelo.IServidor;
import RMI.CRMI;
import RMI.MissingConfigurationParameterException;
import VO.VOMensaje;
import Vista.VPrincipal;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.Registry;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

public class CPrincipal {
    VPrincipal vista;
    CLogin cl;
    IServidor iserver;
    ICliente iclient;
    Registry registro;
    String user;
    int puerto;

    public CPrincipal() {
        vista = new VPrincipal(this);
        vista.setVisible(false);
        cl = new CLogin(this);
        try {
            iserver = CRMI.getServidor(iserver);
            this.puerto=iserver.pidePuerto();
            System.out.println("puerto: "+puerto);
            registro = CRMI.iniciarRegistro(puerto);
            CRMI.setCliente(registro, iserver, this);
        } catch (MissingConfigurationParameterException ex) {
            Logger.getLogger(CPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NotBoundException ex) {
            Logger.getLogger(CPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MalformedURLException ex) {
            Logger.getLogger(CPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RemoteException ex) {
            Logger.getLogger(CPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public int Enviar(VOMensaje m, String clave) throws RemoteException {
        m.setEmisor(user);
        Vector us = iserver.getUserContectados();
        if(us.size()<2) {
            this.vista.VentanaFeedback("No hay otro usuario conectado", "Enviar");
            return 1;
        } else if(us.size()==2) {
            if(((Vector)us.get(0)).get(0).toString().compareTo(user)==0) {
                m.setReceptor(((Vector)us.get(1)).get(0).toString());
            } else {
                m.setReceptor(((Vector)us.get(0)).get(0).toString());
            }
        } else if(us.size()>2) {
            Object[] usuarios = new Object[us.size()-1];
            int j=0;
            for(int i=0; i<us.size(); i++) {
                if(((Vector)us.get(i)).get(0).toString().compareTo(user)!=0) {
                    usuarios[j]=((Vector)us.get(i)).get(0).toString();
                    j++;
                }
            }
            String s = (String)JOptionPane.showInputDialog(
                    this.vista,
                    "Selecciona al destinatario:", "Usuarios",
                    JOptionPane.PLAIN_MESSAGE,
                    null,
                    usuarios,
                    "");
            if(s!=null && s.compareTo("")!=0) {
                m.setReceptor(s);
            } else return 1;
        }
        return iserver.enviar(this.Encriptar(m, clave));
    }

    public VOMensaje Encriptar(VOMensaje m, String clave) {
        Encriptador enc=new Encriptador(m, clave);
        return enc.Encriptar();
    }

    public void Desencriptar(VOMensaje m, String clave) {
        System.out.println("desen: "+m.getMsj());
        Desencriptador denc = new Desencriptador(m, clave);
        vista.Recibir(denc.Desencriptar());
    }

    public int logout() throws RemoteException {
        if(this.iserver.logout(user)==0) {
            System.exit(0);
            return 0;
        } else {
            System.out.println("no se pudo cerrar sesion");
            return 1;
        }
    }

    public int Login(String user) throws RemoteException {
        this.user=user;
        return iserver.login(iclient, this.puerto, this.user);
    }

    void setIden(String string) {
        this.vista.setIden(string);
    }

    public void Recibir(VOMensaje m) {
        vista.Recibir(m);
    }
}
